package com.leyou.page.service;


import com.leyou.ItemClient;


import com.leyou.common.exception.domain.ExceptionEnum;
import com.leyou.common.exception.domain.LyException;
import com.leyou.item.dto.BrandDTO;
import com.leyou.item.dto.CategoryDTO;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class PageService {

    @Autowired
    private ItemClient itemClient;
    @Value("${ly.static.itemDir}")
    private String itemDir;

    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;

    @Autowired
    private TemplateEngine templateEngine;

    public Map<String, Object> queryItemData(Long spuId) {
        //根据spuId查询Spu对象，要给对象中的sku集合和detail对象赋值
        SpuDTO spuDTO = itemClient.findSpuBySpuId(spuId);
        //根据spu分类的三级id的集合查询出分类的对象集合  已经有了
        List<CategoryDTO> categoryDTOS = itemClient.findByCategorysByIds(spuDTO.getCategoryIds());
        //根据spu中品牌id查询品牌对象  已经有了
        BrandDTO brandDTO = itemClient.findBrandById(spuDTO.getBrandId());
        //根据spu中第三级商品分类查询出规格组集合及其下规格参数集合
        List<SpecGroupDTO> groupDTOS = itemClient.findSpecGroupWithParamsByCid(spuDTO.getCid3());

        Map<String, Object> itemMap = new HashMap<>();
        itemMap.put("categories", categoryDTOS);//商品的分类对象的集合
        itemMap.put("brand", brandDTO);//商品品牌的对象
        itemMap.put("spuName", spuDTO.getName());
        itemMap.put("subTitle", spuDTO.getSubTitle());
        itemMap.put("detail", spuDTO.getSpuDetail());//商品详情SpuDetail对象
        itemMap.put("skus", spuDTO.getSkus());//sku的集合
        itemMap.put("specs", groupDTOS);//规格组的集合，其实每个规格组对象中有一个参数为params的规格参数集合
        return itemMap;
    }

    /**
     * 构建商品的静态页面
     */
    public void buildStaticPage(Long spuId) {
        //准备上下文
        Context context = new Context();
        context.setVariables(queryItemData(spuId));

        //指定静态页面在服务器中的地址和名称
        File pageFile = new File(new File(itemDir), spuId + ".html");

        try (PrintWriter write = new PrintWriter(pageFile)) {
            //参数一：模板名称，参数二：上下文，参数三：打印流
            templateEngine.process(itemTemplate, context, write);
        } catch (Exception e) {
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }

    }

    public void delStaticPage(Long id) {
        //得到当前静态页对象
        File pageFile = new File(new File(itemDir), id + ".html");
        //如果存在就删除
        if(pageFile.exists()){
            pageFile.delete();
        }
    }
}
